perm filename DPYPAK.SAI[KID,KMC] blob sn#131190 filedate 1974-11-15 generic text, type T, neo UTF8
BEGIN "DPYPAK"

COMMENT

	THIS PROGRAM IS USED TO CREATE PACKED DPY FILES TO
BE READ BY DDRGET. IT ASKS FIRST FOR AN OUTPUT FILE NAME.
THIS WILL BE THE NAME OF THE PACKED DPY FILE. YOU MAY NOT
SPECIFY AN EXTENSION. THE EXTENSION "DPY" WILL BE ADDED ONTO
THE NAME YOU TYPE. NEXT, THE PROGRAM ASKS FOR THE DPY FILE
LIST NAME, WHICH IS UNRESTRICTED. THIS FILE IS A STOPGAP FILE
WITH THE NAME OF A DPY FILE ON EACH LINE. EACH NAME MUST BE
EXTENSIONLESS, AND WILL GET THE "DPY" EXTENSION ADDED TO IT.
THE PROGRAM WILL THEN CREATE THE COMPRESSED DPY FILE, INCLUDING
THE "DIRECTORY". WHEN IT IS FINISHED IT WILL TELL YOU AND WILL
ASK FOR A FILE NAME FOR A MAP OF DPY PACKED FILE. YOU MAY GIVE
IT ANY VALID FILE NAME FOR THE MAP, WHICH MAY BE LISTED LATER.
THE MAP WILL GIVE THE RECORD NUMBER OF THE FILE WHERE EACH
DPY SUB-FILE STARTS. IF YOU DO NOT WANT A MAP, THEN JUST TYPE
A CARRIAGE RETURN TO THE QUESTION.

;

DEFINE FORCE=" ",TTY="1",DSKI="2",DSKO="3",MAP="4",TAB="'11",CRLF="'15&'12",
   LIN="1",TXTI="5";
DEFINE UGETF(CHAN,LOC)="ZILCH ← CODE(('73 LSH 27)+(CHAN LSH 23),LOC)";
INTEGER ZILCH,ERR,I,J,K,ALLOK,MAXFILES,WRITTEN,NEXTREC;
STRING OUTFILE,S;
INTEGER ARRAY SIXNAME,RECNO[1:1000],DSKBUF[1:2001];
STRING ARRAY DFNAME[1:1000];

OPEN(TTY,"TTY",0,2,2,100,ZILCH,ZILCH);
OPEN(DSKO,"DSK",'17,0,2,0,ZILCH,ZILCH);
OPEN(TXTI,"DSK",0,2,0,100,ZILCH,ZILCH);
OPEN(DSKI,"DSK",'17,2,0,0,ZILCH,ZILCH);
SETBREAK(LIN,'15,'12,"IN");

OUT(TTY,CRLF&"OUTPUT FILE NAME?  ");
OUTFILE ← INPUT(TTY,LIN)&".DPY";
ENTER(DSKO,OUTFILE,ZILCH);
FORCE ERR ← TRUE; WHILE ERR DO
   BEGIN
   OUT(TTY,"NAME OF DPY FILE LIST?  ");
   S ← INPUT(TTY,LIN);
   LOOKUP(TXTI,S,ERR);
   IF ERR THEN OUT(TTY,"***NO FILE NAMED "&S&"***"&CRLF);
   END;

COMMENT ASSEMBLE THE LIST OF DPY FILE NAMES;
I ← 0;
FORCE S ← " "; WHILE LENGTH(S)>0 DO
   BEGIN
   S ← INPUT(TXTI,LIN);
   IF LENGTH(S)>0 THEN
      BEGIN
      I ← I+1;
      DFNAME[I] ← S&".DPY";
      END;
   END;

IF I=0 THEN OUT(TTY,"***ILLEGAL FILE LIST***") ELSE
IF I>1000 THEN OUT(TTY,"***TOO MANY FILES; 1000 IS THE MAXIMUM***")
ELSE
   BEGIN
   MAXFILES ← I;
   ALLOK ← TRUE;
   COMMENT CHECK OUT EACH FILE NAME TO MAKE SURE THE FILE IS OK;
   FOR I←1 STEP 1 UNTIL MAXFILES DO
      BEGIN
      LOOKUP(DSKI,DFNAME[I],ERR);
      IF ERR THEN
         BEGIN
         ALLOK ← FALSE;
         OUT(TTY,"***FILE "&DFNAME[I]&" DOES NOT EXIST***"&CRLF);
         END;
      END;
   IF ALLOK THEN
      BEGIN
      FOR I←1 STEP 1 UNTIL MAXFILES DO SIXNAME[I] ← CVSIX(DFNAME[I]);
      COMMENT  THE NEXT STATEMENTS ARE USED TO GENERATE THE BLOCK NOS. FOR THE DIRECTORY;
      ARRYOUT(DSKO,DSKBUF[I],1+2*MAXFILES);
      FOR I←1 STEP 1 UNTIL MAXFILES DO
         BEGIN
         LOOKUP(DSKI,DFNAME[I],ZILCH);
         ARRYIN(DSKI,DSKBUF[1],2);
	 OUT(TTY,"LENGTH(" & DFNAME[I] & ") = " & TAB & CVS(DSKBUF[2]) & CRLF);
	 IF DSKBUF[2]>1000 THEN
	 BEGIN
	    OUT(TTY,"***ERROR: DPY FILE " & DFNAME[I] & " IS TOO LARGE!!***" & CRLF);
	    CALL(0,"EXIT");
	 END;
         UGETF(DSKO,NEXTREC);
         RECNO[I] ← NEXTREC;
         USETO(DSKO,NEXTREC);
         ARRYOUT(DSKO,DSKBUF[1],DSKBUF[2]+2);
         END;
      CLOSE(DSKO);

      COMMENT ALPHABETIZE THE DIRECTORY;
      FOR J←MAXFILES STEP -1 UNTIL 2 DO
         FOR K←1 STEP 1 UNTIL J-1 DO
            IF SIXNAME[I]>SIXNAME[I+1] THEN
               BEGIN
               SIXNAME[I] ↔ SIXNAME[I+1];
               RECNO[I] ↔ RECNO[I+1];
               END;

      LOOKUP(DSKI,OUTFILE,ZILCH);
      ENTER(DSKO,OUTFILE,ZILCH);
      DSKBUF[1] ← MAXFILES;   COMMENT THE 1ST WORD OF THE DIRECTORY HAS THE NUMBER OF ENTRIES;
      FOR I←1 STEP 1 UNTIL MAXFILES DO
         BEGIN
         DSKBUF[2*I] ← SIXNAME[I];
         DSKBUF[2*I+1] ← RECNO[I];
         END;
      ARRYOUT(DSKO,DSKBUF[1],1+2*MAXFILES);   COMMENT WRITE OUT THE DIRECTORY;

      COMMENT NOW WRITE OUT EACH FILE;
      FOR I←1 STEP 1 UNTIL MAXFILES DO
         BEGIN
         LOOKUP(DSKI,DFNAME[I],ZILCH);
         ARRYIN(DSKI,DSKBUF[1],1002);		COMMENT AT MOST 1000 DISPLAY WORDS WILL BE WRITTEN;
         ARRYOUT(DSKO,DSKBUF[1],DSKBUF[2]+2);
         END;
      CLOSE(DSKO);
      OUT(TTY,CRLF & "!!!THE DIRECTORY HAS BEEN WRITTEN!!!" & CRLF & "FILE NAME FOR MAP?  ");
      S ← INPUT(TTY,LIN);
      IF LENGTH(S)>0 THEN
         BEGIN
         OPEN(MAP,"DSK",0,0,2,0,ZILCH,ZILCH);
         ENTER(MAP,S,ZILCH);
         OUT(MAP,"MAP FOR SUB-FILE DIRECTORY """&OUTFILE&""""&CRLF&CRLF);
         FOR I←1 STEP 1 UNTIL MAXFILES DO
            OUT(MAP,DFNAME[I]&TAB&(IF LENGTH(DFNAME[I])<8 THEN TAB ELSE "")&CVS(RECNO[I])&CRLF);
         RELEASE(MAP);
         END;
      END;
   END;
END;